export interface LabReactionData {
    /**
     * 资源类型
     */
    type?: ResourceConstant
    /**
     * 资源的数量（这是能否反应的标志）
     */
    amount?: number
}

export interface LabReactionTask {
    /**
     * 资源类型
     */
    type: MineralCompoundConstant
    /**
     * 需要的数量
     */
    amount: number
    /**
     * 优先级，越小优先级越高
     */
    priority: number
}

export interface LabBoostData {
    /**
     * 资源类型
     */
    type?: ResourceConstant
    /**
     * 需要的数量
     */
    require?: number
    /**
     * 需要 boost 的爬
     */
    creeps: { name: string; require: number }[]
}

export interface LabMemory {
    /**
     * 底物 lab
     */
    inLab: {
        [id: Id<StructureLab>]: {
            // 反应数据
            reaction: LabReactionData
            // boost 数据
            boost: LabBoostData
        }
    }
    /**
     * 反应 lab
     */
    outLab: {
        [id: Id<StructureLab>]: {
            // 反应数据s
            boost: LabBoostData
            /**
             * 是否禁止反应
             */
            forbidReaction?: boolean
        }
    }
    /**
     * 反应任务
     */
    tasks: LabReactionTask[]
}

export type CreepBoostData = {
    [part in BodyPartConstant]?: {
        // boost的类型
        type: MineralBoostConstant
        // boost的数量(指部件的数量而不是资源的数量，这样统计方便些)
        require: number
        // 已经boost的数量
        amount: number
    }
}

declare global {
    interface RoomMemory {
        lab: LabMemory
    }

    interface StructureLab {
        /**
         * 是否已经 boost 过了，每 tick 只能 boost 一遍
         */
        _boosted?: boolean
    }

    interface CreepMemory {
        /**
         * 爬的 boost 信息
         */
        boost?: {
            /**
             * boost 是否已经完成
             */
            done?: boolean
            /**
             * boost 相关的数据
             */
            data: CreepBoostData
            /**
             * wait 是否先等等
             */
            wait?: boolean
        }
    }
}
